###
 # @Author: Clark
 # @Email: haixuanwoTxh@gmail.com
 # @Date: 2021-12-01 14:48:20
 # @LastEditors: Clark
 # @LastEditTime: 2021-12-01 15:41:55
 # @Description: file content
###

# awk [选项参数] 'script' var=value file(s)
# 或
# awk [选项参数] -f scriptfile var=value file(s)

# -F fs or --field-separator fs
# 指定输入文件折分隔符，fs是一个字符串或者是一个正则表达式，如-F:。
# -v var=value or --asign var=value
# 赋值一个用户定义变量。
# -f scripfile or --file scriptfile
# 从脚本文件中读取awk命令。
# -mf nnn and -mr nnn
# 对nnn值设置内在限制，-mf选项限制分配给nnn的最大块数目；-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能，在标准awk中不适用。
# -W compact or --compat, -W traditional or --traditional
# 在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样，所有的awk扩展都被忽略。
# -W copyleft or --copyleft, -W copyright or --copyright
# 打印简短的版权信息。
# -W help or --help, -W usage or --usage
# 打印全部awk选项和每个选项的简短说明。
# -W lint or --lint
# 打印不能向传统unix平台移植的结构的警告。
# -W lint-old or --lint-old
# 打印关于不能向传统unix平台移植的结构的警告。
# -W posix
# 打开兼容模式。但有以下限制，不识别：/x、函数关键字、func、换码序列以及当fs是一个空格时，将新行作为一个域分隔符；操作符**和**=不能代替^和^=；fflush无效。
# -W re-interval or --re-inerval
# 允许间隔正则表达式的使用，参考(grep中的Posix字符类)，如括号表达式[[:alpha:]]。
# -W source program-text or --source program-text
# 使用program-text作为源代码，可与-f命令混用。
# -W version or --version
# 打印bug报告信息的版本

#  awk 更适合格式化文本，对文本进行较复杂格式处理
# 1、awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号
# 每行按空格或TAB分割，输出文本中的1、4项
awk '{print $1,$4}' log.txt

# 2、grep 更适合单纯的查找或匹配文本
grep -rn test *file # -r递归查找，-n打印匹配到的行号

# grep –e "正则表达式" 文件名
# grep –i "被查找的字符串" 文件名  # -i不区分大小写

# 3、sed 更适合编辑匹配到的文本
# -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
# -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
# a ：新增， a 的后面可以接字串，而这些字串会在新的一行出现(目前的下一行)～
# c ：取代， c 的后面可以接字串，这些字串可以取代 n1,n2 之间的行！
# d ：删除，因为是删除啊，所以 d 后面通常不接任何咚咚；
# i ：插入， i 的后面可以接字串，而这些字串会在新的一行出现(目前的上一行)；
# p ：打印，亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行～
# s ：取代，可以直接进行取代的工作哩！通常这个 s 的动作可以搭配正规表示法！例如 1,20s/old/new/g 就是啦！

sed -e 4a\newLine test.txt # 在第四行添加一行newLine
cat test.txt | sed '2,5d'    # 删除2到5行
cat test.txt | sed '3,$d'    # 删除3到最后行
cat test.txt | sed '2a haha shit'    # 第2行后添加
cat test.txt | sed '2i haha shit'    # 第2行前添加
sed 's/要被取代的字串/新的字串/g'
ifconfig wlp5s0 | grep 'netmask' | sed 's/^.* inet//g' | sed 's/netmask.*$//g' # 获取IP

# 4、xargs
# xargs（英文全拼： eXtended ARGuments）是给命令传递参数的一个过滤器，也是组合多个命令的一个工具。
# xargs 可以将管道或标准输入（stdin）数据转换成命令行参数，也能够从文件的输出中读取数据。
# xargs 也可以将单行或多行文本输入转换为其他格式，例如多行变单行，单行变多行。
# xargs 默认的命令是 echo，这意味着通过管道传递给 xargs 的输入将会包含换行和空白，不过通过 xargs 的处理，换行和空白将被空格取代。
# xargs 是一个强有力的命令，它能够捕获一个命令的输出，然后传递给另外一个命令。
# 之所以能用到这个命令，关键是由于很多命令不支持|管道来传递参数，而日常工作中有有这个必要，所以就有了 xargs 命令
cat test.txt | xargs        # 多行输入单行输出
cat test.txt | xargs -n3    # 每3个字符一行
echo "nameXnameXnameXname" | xargs -dX # -d 选项可以自定义一个定界符
ls *.jpg | xargs -n1 -I {} cp {} /data/images # 复制所有图片文件到 /data/images 目录下
cat url-list.txt | xargs wget -c # 下载所有url


# 5、find
# find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;
find . -name "*.c" # 将当前目录及其子目录下所有文件后缀为 .c 的文件列出来


# 6、wc
# 利用wc指令我们可以计算文件的Byte数、字数、或是列数，若不指定文件名称、或是所给予的文件名为"-"，则wc指令会从标准输入设备读取数据
# wc [-clw][--help][--version][文件...]
# -c或--bytes或--chars 只显示Bytes数。
# -l或--lines 显示行数。
# -w或--words 只显示字数。
wc test.txt

# 7、nl
nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号！
其默认的结果与 cat -n 有点不太一样， nl 可以将行号做比较多的显示设计，包括位数与是否自动补齐 0 等等的功能。
